home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / games / larn12s.arc / LARN.ARC / SIGNAL.C < prev    next >
C/C++ Source or Header  |  1987-10-28  |  5KB  |  179 lines

  1. #include <signal.h>
  2. #ifdef GEMDOS
  3. #include <osbind.h>
  4. #include <xbios.h>
  5. #endif
  6. #include "header.h"            /* "Larn is copyrighted 1986 by Noah Morgan.\n" */
  7. #define BIT(a) (1<<((a)-1))
  8. extern char savefilename[],wizard,predostuff,nosignal;
  9. static s2choose()    /* text to be displayed if ^C during intro screen */
  10.     {
  11.     cursor(1,24); lprcat("Press "); setbold(); lprcat("return"); resetbold();
  12.     lprcat(" to continue: ");   lflush(); 
  13.     }
  14.  
  15. static cntlc()    /* what to do for a ^C */
  16.     {
  17.     if (nosignal) return;    /* don't do anything if inhibited */
  18. # ifdef UNIX
  19.     signal(SIGQUIT,SIG_IGN);
  20. # endif
  21.     signal(SIGINT,SIG_IGN);
  22.     quit(); if (predostuff==1) s2choose(); else showplayer();
  23.     lflush();
  24. # ifdef UNIX
  25.     signal(SIGQUIT,cntlc);
  26. # endif
  27.     signal(SIGINT,cntlc);
  28.     }
  29.  
  30. /*
  31.  *    subroutine to save the game if a hangup signal
  32.  */
  33. static sgam()
  34.     {
  35.     savegame(savefilename);  wizard=1;  died(-257); /* hangup signal */
  36.     }
  37.  
  38. #ifdef SIGTSTP
  39. static tstop() /* control Y    */
  40.     {
  41.     if (nosignal)   return;  /* nothing if inhibited */
  42.     lcreat((char*)0);  clearvt100();    lflush();      signal(SIGTSTP,SIG_DFL);
  43. #ifdef SIGVTALRM
  44.     /* looks like BSD4.2 or higher - must clr mask for signal to take effect*/
  45.     sigsetmask(sigblock(0)& ~BIT(SIGTSTP));
  46. #endif
  47.     kill(getpid(),SIGTSTP);
  48.  
  49.     setupvt100();  signal(SIGTSTP,tstop);
  50.     if (predostuff==1) s2choose(); else drawscreen();
  51.     showplayer();    lflush();
  52.     }
  53. #endif SIGTSTP
  54.  
  55. /*
  56.  *    subroutine to issue the needed signal traps  called from main()
  57.  */
  58. #ifdef SIGFPE
  59. static sigfpe()  { sigpanic(SIGFPE); }
  60. #endif
  61. # ifndef MSDOS
  62. static sigbus()  { sigpanic(SIGBUS); }
  63. static sigill()  { sigpanic(SIGILL); }     static sigtrap() { sigpanic(SIGTRAP); }
  64. #ifdef SIGIOT
  65. static sigiot()  { sigpanic(SIGIOT); }   static sigemt()  { sigpanic(SIGEMT); }
  66. #endif
  67. static sigsegv() { sigpanic(SIGSEGV); }  static sigsys()  { sigpanic(SIGSYS); }
  68. static sigpipe() { sigpanic(SIGPIPE); }  static sigterm() { sigpanic(SIGTERM); }
  69. # endif
  70.  
  71. sigsetup()
  72.     {
  73.     signal(SIGINT,  cntlc);
  74. #ifdef SIGFPE
  75.     signal(SIGFPE,  sigfpe);
  76. #endif
  77. # ifndef MSDOS
  78.     signal(SIGBUS,  sigbus);        signal(SIGQUIT, cntlc);
  79.     signal(SIGKILL, SIG_IGN);        signal(SIGHUP,  sgam);
  80.     signal(SIGILL,  sigill);        signal(SIGTRAP, sigtrap);
  81. #ifdef SIGIOT
  82.     signal(SIGIOT,  sigiot);        signal(SIGEMT,  sigemt);
  83. #endif
  84.     signal(SIGSEGV, sigsegv);        signal(SIGSYS,  sigsys);
  85.     signal(SIGPIPE, sigpipe);        signal(SIGTERM, sigterm);
  86. #ifdef SIGTSTP
  87.     signal(SIGTSTP,tstop);        signal(SIGSTOP,tstop);
  88. #endif SIGTSTP
  89. # endif
  90.     }
  91.  
  92. #ifdef BSD    /* for BSD UNIX? */
  93.  
  94. static char *signame[NSIG] = { "",
  95. "SIGHUP",  /*    1     hangup */
  96. "SIGINT",  /*    2     interrupt */
  97. "SIGQUIT", /*    3     quit */
  98. "SIGILL",  /*    4     illegal instruction (not reset when caught) */
  99. "SIGTRAP", /*    5     trace trap (not reset when caught) */
  100. "SIGIOT",  /*    6     IOT instruction */
  101. "SIGEMT",  /*    7     EMT instruction */
  102. "SIGFPE",  /*    8     floating point exception */
  103. "SIGKILL", /*    9     kill (cannot be caught or ignored) */
  104. "SIGBUS",  /*    10     bus error */
  105. "SIGSEGV", /*    11     segmentation violation */
  106. "SIGSYS",  /*    12     bad argument to system call */
  107. "SIGPIPE", /*    13     write on a pipe with no one to read it */
  108. "SIGALRM", /*    14     alarm clock */
  109. "SIGTERM", /*    15     software termination signal from kill */
  110. "SIGURG",  /*    16     urgent condition on IO channel */
  111. "SIGSTOP", /*    17     sendable stop signal not from tty */
  112. "SIGTSTP", /*    18     stop signal from tty */
  113. "SIGCONT", /*    19     continue a stopped process */
  114. "SIGCHLD", /*    20     to parent on child stop or exit */
  115. "SIGTTIN", /*    21     to readers pgrp upon background tty read */
  116. "SIGTTOU", /*    22     like TTIN for output if (tp->t_local<OSTOP) */
  117. "SIGIO",   /*    23     input/output possible signal */
  118. "SIGXCPU", /*    24     exceeded CPU time limit */
  119. "SIGXFSZ", /*    25     exceeded file size limit */
  120. "SIGVTALRM",/*  26     virtual time alarm */
  121. "SIGPROF", /*    27     profiling time alarm */
  122. "","","","" };
  123.  
  124. #else BSD    /* for system V? */
  125.  
  126. static char *signame[NSIG] = { "",
  127. "SIGHUP",  /*    1     hangup */
  128. "SIGINT",  /*    2     interrupt */
  129. "SIGQUIT", /*    3     quit */
  130. "SIGILL",  /*    4     illegal instruction (not reset when caught) */
  131. "SIGTRAP", /*    5     trace trap (not reset when caught) */
  132. #ifdef SIGIOT
  133. "SIGIOT",  /*    6     IOT instruction */
  134. "SIGEMT",  /*    7     EMT instruction */
  135. #endif
  136. # ifdef MSDOS
  137. "SIGFPE"}; /*    8     floating point exception */
  138. # else
  139. #ifdef SIGFPE
  140. "SIGFPE",  /*    8     floating point exception */
  141. #endif
  142. "SIGKILL", /*    9     kill (cannot be caught or ignored) */
  143. "SIGBUS",  /*    10     bus error */
  144. "SIGSEGV", /*    11     segmentation violation */
  145. "SIGSYS",  /*    12     bad argument to system call */
  146. "SIGPIPE", /*    13     write on a pipe with no one to read it */
  147. "SIGALRM", /*    14     alarm clock */
  148. "SIGTERM", /*    15     software termination signal from kill */
  149. "SIGUSR1",  /*    16     user defines signal 1 */
  150. "SIGUSR2", /*    17     user defines signal 2 */
  151. "SIGCLD",  /*    18     child death */
  152. "SIGPWR",  /*    19     power fail */
  153. "","","","","","","","","","","","" };
  154. # endif;
  155.  
  156. #endif BSD
  157.  
  158. /*
  159.  *    routine to process a fatal error signal
  160.  */
  161. sigpanic(sig)
  162.     int sig;
  163.     {
  164.     char buf[128];
  165.     signal(sig,SIG_DFL);
  166. #ifdef GEMDOS
  167.     Bioskeys();
  168. #endif
  169.     sprintf(buf,"\nLarn - Panic! Signal %d received [%s]",sig,signame[sig]);
  170.     write(2,buf,strlen(buf));  sleep(2);
  171.     sncbr();
  172.     savegame(savefilename); 
  173. # ifndef UNIX
  174.     exit(1);
  175. # else
  176.     kill(getpid(),sig); /* this will terminate us */
  177. # endif
  178.     }
  179.